package br.org.acessobrasil.portal.action;


import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import br.org.acessobrasil.facade.FacadeException;
import br.org.acessobrasil.portal.facade.ItemMenuFacade;
import br.org.acessobrasil.portal.modelo.ItemMenu;
import br.org.acessobrasil.portal.modelo.Menu;
import br.org.acessobrasil.portal.modelo.Pagina;
import br.org.acessobrasil.portal.modelo.Sitio;
import br.org.acessobrasil.portal.modelo.Usuario;
import br.org.acessobrasil.portal.util.ListItem;


public class ItemMenuAction extends Super implements ItemMenuActionInterface{

	private static final long serialVersionUID = 1293801945334863313L;
	
	private Menu menu;
	private Long nu_menu;
	private ItemMenu itemMenu;
	private List<ListItem> listPagina;
	private List<Pagina> listaDePaginasReais;
	private List<ItemMenu> listItemMenu;
	private ItemMenuFacade itemMenuFacade;
	private boolean esconder;
	private String fator; 
	private Sitio sitio;
	
	private static Logger logger = Logger.getLogger(ItemMenuAction.class);
	
	/**
	 * Passado como parametro de querystring
	 * ex.: inserir.action?ordem=3&nivel=2
	 */
	private Integer ordem=0,nivel=1;
	
	public ItemMenuAction(ItemMenuFacade itemMenuFacade){
		this.itemMenuFacade = itemMenuFacade;
	}	
	
	private void carregarListas(){
		if(listPagina==null){
			listPagina = new ArrayList<ListItem>();
			ListItem t = new ListItem();
			t.setKey(null);
			t.setValue("Selecione");
			listPagina.add(t);
			try{
				List<Pagina> listTemp = itemMenuFacade.listarPaginas(getSitioAtual().getNuSitio());
				for (Pagina pag : listTemp) {
					t = new ListItem();
					t.setKey(pag.getNuPagina());
					t.setValue(pag.getNuPagina() + " " + pag.getNoTitulo());
					listPagina.add(t);
				}
			}catch (FacadeException e) {
				logger.error("Erro ao carragar listas", e);
			}	
		}
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#criarItemMenu()
	 */
	public String criarItemMenu(){
		Usuario usuario = getUsuarioLogado();
		carregarListas();
		try{
			if(getBtnGravar() != null){//Usuario apertou gravar
				itemMenu.setNuMenu(nu_menu);
				//Limpar caso seja o valor padrao
				if(itemMenu.getDeAjuda()!=null && itemMenu.getDeAjuda().equals(getText("predefinido.dica"))){
					itemMenu.setDeAjuda(null);
				}
				//limpar o valor caso seja o padrao
				if(itemMenu.getNoLinkExterno()!=null && itemMenu.getNoLinkExterno().equals(getText("predefinido.linkExterno"))){
					itemMenu.setNoLinkExterno(null);
				}
				itemMenuFacade.criar(getUsuarioLogado(), itemMenu);	
				usuario.addActionMessage("Menu \""+itemMenu.getNoTitulo()+"\" adicionado com sucesso.");	
				//Limpando os campos mas mantendo a ordem do proximo abaixo do criado
				int ordemNova = itemMenu.getNuOrdem();
				int nivelNovo = itemMenu.getNuNivel();
				itemMenu = new ItemMenu();
				itemMenu.setNoTitulo(getText("predefinido.link"));
				itemMenu.setDeAjuda(getText("predefinido.dica"));				
				itemMenu.setNoLinkExterno(getText("predefinido.linkExterno"));
				itemMenu.setNuNivel(nivelNovo);
				itemMenu.setNuOrdem(ordemNova);
				itemMenu.setCoEsconder(esconder);
			}else{
				//Usuario provavelmente veio de um link
				itemMenu = new ItemMenu();
				itemMenu.setNoTitulo(getText("predefinido.link"));
				itemMenu.setDeAjuda(getText("predefinido.dica"));				
				itemMenu.setNoLinkExterno(getText("predefinido.linkExterno"));
				itemMenu.setNuNivel(nivel);
				itemMenu.setNuOrdem(ordem);
				itemMenu.setCoEsconder(esconder);				
			}	
		}catch(FacadeException e){
			logger.error("Erro: ",e);
			usuario.addActionError("Erro: " + e.getMessage());
		}
		return SUCCESS;			
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#listarItensDeMenu()
	 */
	public String listarItensDeMenu() {		
		try{
			listItemMenu = itemMenuFacade.listarItensDeMenu(getUsuarioLogado(),nu_menu);
			StringBuilder sb = null;
			for (ItemMenu itemMenu : listItemMenu) {
				//ajusta o nome de apresentacao
				
				int nivel = itemMenu.getNuNivel();
				sb = new StringBuilder(itemMenu.getNoTitulo());
				for(int i = 0; i < nivel - 1 ; i++){
					sb.insert(0, " -- ");
				}
				itemMenu.setNoTituloApresentacao(sb.toString());
				
				//insere a pagina associada
				if(itemMenu.getNuPagina() != null){
					itemMenu.setPaginaAssociada(itemMenuFacade.buscarPagina(getUsuarioLogado(), itemMenu.getNuPagina()));
				}
			}
		}catch(Exception e ){
			e.printStackTrace();
			logger.error("Erro ao listar",e);
		}		
		return SUCCESS;
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#deletarItemMenu()
	 */
	public String deletarItemMenu(){
		//TODO terminar]]
		if(btnCancelar==null && btnApagar==null){
			try {			
				itemMenu = itemMenuFacade.buscar(getUsuarioLogado(), itemMenu.getNuItemMenu());
				if(itemMenu.getListPagina()!=null && itemMenu.getListPagina().size()>0){
					addActionError("Existem p&aacute;ginas que pertencem a esta se&ccedil;&atilde;o, por isso n&atilde;o &eacute; poss 	&iacute;vel apag&aacute;-lo.");
				}
				return INPUT;
			} catch (FacadeException e) {
				logger.error("Erro ao apagar item menu"+ itemMenu,e);
			}
		}else if(btnApagar!=null){
			//Apertou o botao apagar
			logger.debug("Apagando o itemMenu id = " + itemMenu.getNuItemMenu());
			try {
				itemMenu = itemMenuFacade.buscar(getUsuarioLogado(), itemMenu.getNuItemMenu());
				if(itemMenu.getListPagina()!=null && itemMenu.getListPagina().size()>0){
					addActionError("Existem p&aacute;ginas que pertencem a esta se&ccedil;&atilde;o, por isso n&atilde;o &eacute; poss&iacute;vel apag&aacute;-lo.");
					return INPUT;
				}else{
					itemMenuFacade.excluir(getUsuarioLogado(), itemMenu);
					logger.debug("Apagado");
				}
			} catch (FacadeException e) {
				logger.error("Erro ao apagar Item menu"+ itemMenu,e); 
			}				
		}else if(btnCancelar!=null){
			return SUCCESS;
		}
		return SUCCESS;
	}	
	
	@SuppressWarnings("unused")
	private String confirmarDeletarItemMenu(){		
		try {			
			itemMenu = itemMenuFacade.buscar(getUsuarioLogado(), itemMenu.getNuItemMenu());
		} catch (FacadeException e) {
			logger.error("Erro ao apagar item menu"+ itemMenu,e);
		}
		
		return SUCCESS;
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#alterarOrdemItemMenu()
	 */
	public String alterarOrdemItemMenu(){
		try {
			if(fator.equals("1"))
				itemMenuFacade.aumentarOrdemItem(getUsuarioLogado(),itemMenu);
			else if(fator.equals("0"))
				itemMenuFacade.diminuirOrdemItem(getUsuarioLogado(),itemMenu);
		} catch (FacadeException e) {
			e.printStackTrace();
		}			
		return  SUCCESS;		
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#alterarNivelItemMenu()
	 */
	public String alterarNivelItemMenu(){
		try {
			if(fator.equals("1"))
				itemMenuFacade.aumentarNivelItem(getUsuarioLogado(),itemMenu);
			else if(fator.equals("0"))
				itemMenuFacade.diminuirNivelItem(getUsuarioLogado(),itemMenu);
		} catch (FacadeException e) {
			e.printStackTrace();
		}			
		return  SUCCESS;		
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#atualizarItemMenu()
	 */
	public String atualizarItemMenu() {
		Usuario usuario = getUsuarioLogado();
		carregarListas();
		itemMenu.setNuMenu(nu_menu);
		try{
			if(btnGravar == null){
				itemMenu = itemMenuFacade.buscar(usuario, itemMenu.getNuItemMenu());
			}else{
				itemMenu = itemMenuFacade.atualizar(usuario, itemMenu);
				usuario.addActionMessage("Atualizado com sucesso");
			}
		}catch(Exception e){
			logger.error("Erro ao atualizar item de menu",e);
			usuario.addActionError("Erro: " + e.getMessage());
		}
		return  SUCCESS;
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#getNuMenu()
	 */
	public long getNuMenu() {
		return nu_menu;
	}

	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#setNuMenu(long)
	 */
	public void setNuMenu(long nu_menu) {
		this.nu_menu = nu_menu;
	}

	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#getMenu()
	 */
	public Menu getMenu() {
		if(menu==null){
			try {
				menu = itemMenuFacade.buscarMenu(getUsuarioLogado(), nu_menu);
			} catch (Exception e){
				logger.error("Erro ao buscar menu " + nu_menu,e);
			}
		}
		return menu;
	}
	
	public String listarPaginasPorItemMenu(){
		if(itemMenu != null && itemMenu.getNuItemMenu() != null){
			try{
				itemMenu = itemMenuFacade.buscar(getUsuarioLogado(), itemMenu.getNuItemMenu());
				listaDePaginasReais = itemMenuFacade.listarPaginasPorItemMenu(getSitioAtual().getNuSitio(), itemMenu.getNuItemMenu());
			}catch (Exception e) {
				e.printStackTrace();
			}
		}
		return SUCCESS;
	}

	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#setMenu(br.org.acessobrasil.portal.modelo.Menu)
	 */
	public void setMenu(Menu menu) {
		this.menu = menu;
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#setItemMenu(br.org.acessobrasil.portal.modelo.ItemMenu)
	 */
	public void setItemMenu(ItemMenu itemMenu) {
		this.itemMenu = itemMenu;
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#getItemMenu()
	 */
	public ItemMenu getItemMenu() {
		return itemMenu;
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#setListPagina(java.util.List)
	 */
	public void setListPagina(List<ListItem> listPagina) {
		this.listPagina = listPagina;
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#getListPagina()
	 */
	public List<ListItem> getListPagina() {
		return listPagina;
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#getOrdem()
	 */
	public Integer getOrdem() {
		return ordem;
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#setOrdem(java.lang.Integer)
	 */
	public void setOrdem(Integer ordem) {
		this.ordem = ordem;
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#getNivel()
	 */
	public Integer getNivel() {
		return nivel;
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#setNivel(java.lang.Integer)
	 */
	public void setNivel(Integer nivel) {
		this.nivel = nivel;
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#getEsconder()
	 */
	public boolean getEsconder(){
		return esconder;
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#setEsconder(boolean)
	 */
	public void setEsconder(boolean esconder) {
		this.esconder = esconder;
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#getSitio()
	 */
	public Sitio getSitio() {
		return sitio;
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#setSitio(br.org.acessobrasil.portal.modelo.Sitio)
	 */
	public void setSitio(Sitio sitio) {
		this.sitio = sitio;
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#getListItemMenu()
	 */
	public List<ItemMenu> getListItemMenu() {
		return listItemMenu;
	}
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#setListItemMenu(java.util.List)
	 */
	public void setListItemMenu(List<ItemMenu> listItemMenu) {
		this.listItemMenu = listItemMenu;
	}
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#getFator()
	 */
	public String getFator() {
		return fator;
	}
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.ItemMenuActionInterface#setFator(java.lang.String)
	 */
	public void setFator(String fator) {
		this.fator = fator;
	}
	
	public List<Pagina> getListaDePaginasReais() {
		return listaDePaginasReais;
	}
	public void setListaDePaginasReais(List<Pagina> listaDePaginasReais) {
		this.listaDePaginasReais = listaDePaginasReais;
	}
}
